// 命令对象
var viewCommand = (function() {
	var tpl = {
		// 展示图片结构模板
		product: [
			'<div>',
				'<img src="{{src}}">',
				'<p>{{text}}</p>',
			'</div>'
		].join(''),
		title: [
			'<div class="title">',
				'<div class="main">',
					'<h2>{{title}}</h2>',
					'<p>{{tips}}</p>',
				'</div>',
			'</div>'
		].join('')
	};
	// 格式化字符串缓存字符串
	var html = '';
	function formatString(str, obj) {
		// 替换字符串
		return str.replace(/\{\{(\w+)\}\}/g, function(match, key) {
			return obj[key];
		});
	}
	// 方法集合
	var Action = {
		// 创建方法
		create: function(data, view) {
			// 解析数据，如果数据是一个数组
			if (data.length) {
				// 遍历数组
				for (var i = 0, len = data.length; i < len; i++) {
					// 将格式化只有的字符串缓存到html中
					html += formatString(tpl[view], data[i]);
				}
			} else {
				// 直接格式化字符串缓存到html中
				html += formatString(tpl[view], data);
			}
		},
		// 展示方法
		display: function(container, data, view) {
			// 如果传入数据
			if (data) {
				// 根据给定数据创建视图
				this.create(data, view);
			}
			// 展示模块
			document.getElementById(container).innerHTML = html;
			// 展示后清空缓存的字符串
			html = '';
		}
	};
	// 命令接口
	return function execute(msg) {
		// 如果没有指令返回
		if(!msg) return;
		// 如果是命令组
		if (msg.length) {
			for (var i = 0, len = msg.length; i < len; i++) {
				// arguments.callee 代表这个方法本身
				arguments.callee(msg[i]);
			}
		// 执行单个命令
		} else {
			// 解析命令 ，如果msg.param不是数组则将其转化为数组，apply第二个参数是数组
			msg.param = Object.prototype.toString.call(msg.param) === '[object Array]' ? msg.param : [msg.param];
			// Action 内部调用的方法引用this，所以此处为保证作用于this执行传入Action
			Action[msg.command].apply(Action, msg.param);
		}
	}
}());
